package com.xj.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * 猜数字游戏
 */
public class L299_猜数字的个数和位置正确的数量 {

    /**
     *你正在和你的朋友玩 猜数字（Bulls and Cows）游戏：你写下一个数字让你的朋友猜。每次他猜测后，你给他一个提示，告诉他有多少位数字和确切位置都猜对了（称为“Bulls”, 公牛），有多少位数字猜对了但是位置不对（称为“Cows”, 奶牛）。你的朋友将会根据提示继续猜，直到猜出秘密数字。
     *
     * 请写出一个根据秘密数字和朋友的猜测数返回提示的函数，用 A 表示公牛，用 B 表示奶牛。
     *
     * 请注意秘密数字和朋友的猜测数都可能含有重复数字。
     *
     * 示例 1:
     *
     * 输入: secret = "1807", guess = "7810"
     *
     * 输出: "1A3B"
     *
     * 解释: 1 公牛和 3 奶牛。公牛是 8，奶牛是 0, 1 和 7。
     * 示例 2:
     *
     * 输入: secret = "1123", guess = "0111"
     *
     * 输出: "1A1B"
     *
     * 解释: 朋友猜测数中的第一个 1 是公牛，第二个或第三个 1 可被视为奶牛。
     * 说明: 你可以假设秘密数字和朋友的猜测数都只包含数字，并且它们的长度永远相等。
     */

    public static void main(String[] args) {
        System.out.println(getHintGood("1807","7810"));
        System.out.println(getHintGood("1123","0111"));
        System.out.println(getHintGood("0","1"));
        System.out.println(getHintGood("1122","1222"));
    }

    //自己的解法：两个hashmap,一个统计位置，一个统计个数
    public static String getHint(String secret, String guess) {
        Map<Integer,Character> locationMap=new HashMap<>();
        Map<Character,Integer> countMap=new HashMap<>();

        //初始化map
        int len=secret.length();
        for (int i=0;i<len;i++){
            char c=secret.charAt(i);
            locationMap.put(i,c);

            Integer value=countMap.get(c);
            if(value!=null){
                value++;
            }else{
                value=1;
            }
            countMap.put(c,value);
        }

        //比较结果
        int countA=0;
        int countB=0;
        for (int i=0;i<len;i++){
            char c=guess.charAt(i);
            if(locationMap.get(i).equals(c)){
                //猜中公牛,奶牛就少1个
                countA++;
                int value=countMap.get(c);
                value--;
                countMap.put(c,value);
            }
        }
        for (int i=0;i<len;i++){
            char c=guess.charAt(i);

            if(locationMap.get(i).equals(c)){
                continue;
            }else if(countMap.get(c)!=null && countMap.get(c)>0){
                //猜中奶牛
                countB++;
                int value=countMap.get(c);
                value--;
                countMap.put(c,value);
            }
        }
        String result=countA+"A"+countB+"B";
        return result;
    }


    //精彩解法：使用1个数组桶，奶牛的个数使用减法计数
    public static String getHintGood(String secret, String guess) {
        int[] bucket = new int[10];
        int bull = 0;
        int cow = 0;
        for(int i=0;i<secret.length();i++){
            if(secret.charAt(i)== guess.charAt(i)){
                bull++;
                continue;
            }
            bucket[secret.charAt(i) - '0'] += 1;
            bucket[guess.charAt(i) - '0'] -= 1;

        }
        //计算bucket中正值的个数
        for(int i=0;i<10;i++){
            if(bucket[i] > 0)
                cow+= bucket[i];
        }

        cow = secret.length() - cow - bull;
        String res = bull + "A" + cow + "B";
        return res;
    }
}